package br.com.droid;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.com.droid.model.Lugar;

public class BancoLugar {

	private static BancoLugar instance;
	private ArrayList<Lugar> listaLugares;

	public BancoLugar() {
		listaLugares = new ArrayList<Lugar>();
	}

	public static BancoLugar getBancoInstance() {
		if (instance == null)
			instance = new BancoLugar();
		return instance;
	}
	
	public int inserir(Lugar lugar) {
		int id = 0;
		String teste = "INSERT into Lugar(id_tipo, id_centro, id_usuario, nomeLugar, referencial, informacoes_adicionais, num_avaliacoes, quant_estrelas) values ('"
				+ lugar.getId_tipo()
				+ "', '"
				+ lugar.getId_centro()
				+ "', '"
				+ lugar.getId_usuario()
				+ "', '"
				+ lugar.getNomeLugar()
				+ "', '"
				+ lugar.getReferencial()
				+ "', '"
				+ lugar.getInformacoes_adicionais()
				+ "', '"
				+ lugar.getNum_avaliacoes()
				+ "', '"
				+ lugar.getQuant_estrelas()
				+ "');";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				stm.executeUpdate(teste, Statement.RETURN_GENERATED_KEYS);
				ResultSet rs = stm.getGeneratedKeys();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				rs.close();
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return id;
	}

	public String atualizar(Lugar lugar) {
		String teste = "update lugar set nomeLugar='" + lugar.getNomeLugar()
				+ "', referencial = '" + lugar.getReferencial()
				+ "', informacoes_adicionais = '"+ lugar.getInformacoes_adicionais()
				+ "', num_avaliacoes = '" + lugar.getNum_avaliacoes()
				+ "', quant_estrelas = '"+ lugar.getQuant_estrelas()  
				+ "' where id=" + lugar.getId() + ";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				stm.executeUpdate(teste);
				ConexaoMySQL.FecharConexao();
				return "Lugar atualizado no banco com sucesso!";
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return "Erro ao atualizar o lugar!";
	}

	public String deletar(int id) {
		String teste = "DELETE from Lugar where id = " + id + ";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				stm.executeUpdate(teste);
				ConexaoMySQL.FecharConexao();
				return "Lugar deletado no banco com sucesso!";
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return "Erro ao inserir o lugar!";
	}


	public Lugar buscarLugar(long id) {
		Lugar lugar = null;
		String teste = "SELECT * from Lugar where id = +" + id + ";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return lugar;
	}

	public Lugar buscarLugar(String nomeLugar) {
		Lugar lugar = null;
		String teste = "SELECT * from Lugar where nomeLugar = +'" + nomeLugar
				+ "';";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return lugar;
	}

	public ArrayList<Lugar> buscarLugaresPorNome(String nome, String nome_tipo,
			long id_centro) {
		BancoTipo tipo = new BancoTipo();
		String teste = "";
		if (nome.equals("_"))
			nome = "";

		if (nome_tipo.equals("Todas as categorias")) {
			teste = "SELECT * FROM lugar where id_centro=" + id_centro
					+ " and upper(nomeLugar) LIKE '%" + nome.toUpperCase()
					+ "%' ;";
		} else {
			long id_tipo = tipo.buscarTipo(nome_tipo).getId();
			teste = "SELECT * FROM id_tipo= " + id_tipo
					+ " and lugar where id_centro=" + id_centro
					+ " and upper(nomeLugar) LIKE '%" + nome.toUpperCase()
					+ "%' ;";
		}

		listaLugares.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					Lugar lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
					listaLugares.add(lugar);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaLugares;
	}

	public ArrayList<Lugar> buscarMeusLugaresPorNome(String nome,
			String nome_tipo, long idUsuario) {
		BancoTipo tipo = new BancoTipo();
		String teste = "";

		if (nome.equals("_"))
			nome = "";

		if (nome_tipo.equals("Todas as categorias")) {

			teste = "SELECT * FROM lugar where id_usuario = " + idUsuario
					+ " and (upper(nomeLugar) LIKE '%" + nome.toUpperCase()
					+ "%' );";
		} else {
			long id_tipo = tipo.buscarTipo(nome_tipo).getId();

			teste = "SELECT * FROM lugar where id_tipo = " + id_tipo
					+ " id_usuario = " + idUsuario
					+ " and (upper(nomeLugar) LIKE '%" + nome.toUpperCase()
					+ "%' );";
		}

		listaLugares.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					Lugar lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
					listaLugares.add(lugar);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaLugares;
	}

	public ArrayList<Lugar> listarLugares(long idCentro) {

		String teste = "SELECT * from Lugar where id_centro = "
				+ idCentro + " ORDER BY lastmodified DESC limit 100;";
		
		listaLugares.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					Lugar lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
					listaLugares.add(lugar);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaLugares;
	}

	public ArrayList<Lugar> listarMeusLugares(long idUsuario) {
		String teste = "SELECT * from Lugar where id_usuario = " + idUsuario
				+ ";";
		
		listaLugares.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					Lugar lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
					listaLugares.add(lugar);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaLugares;
	}

	public ArrayList<Lugar> listarLugaresNaoSincronizados(String data, long idCentro) {

		String teste = "SELECT * from Lugar where id_centro = "+idCentro+" and lastmodified > '" + data + "';";
		listaLugares.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					Lugar lugar = new Lugar();
					lugar.setId(rs.getLong("id"));
					lugar.setId_tipo(rs.getLong("id_tipo"));
					lugar.setId_centro(rs.getLong("id_centro"));
					lugar.setId_usuario(rs.getLong("id_usuario"));
					lugar.setNomeLugar(rs.getString("nomeLugar"));
					lugar.setReferencial(rs.getString("referencial"));
					lugar.setInformacoes_adicionais(rs.getString("informacoes_adicionais"));
					lugar.setNum_avaliacoes(rs.getInt("num_avaliacoes"));
	        		lugar.setQuant_estrelas(rs.getInt("quant_estrelas"));
					lugar.setLastmodified(rs.getString("lastmodified"));
					listaLugares.add(lugar);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaLugares;
	}

}
